W tej pracy dowmowej sprawdzimy jak różnią sie algoytmy k-means i k-metoids. Będziemy korzystać z funkcji eclust, w niej można wybrać jakie algotrymy będziemy używać.
Najpierw sprawdźmy jak wyglądają różne podziały.
grid.arrange(pkmeans2,ppam2, pkmeans3,ppam3,
nrow = 2)
grid.arrange(pkmeans4,ppam4, pkmeans5,ppam5,
nrow = 2)
grid.arrange(pkmeans6,ppam6, pkmeans7,ppam7,
nrow = 2)
grid.arrange(pkmeans8,ppam8, pkmeans8,ppam8,
nrow = 2)
grid.arrange(pkmeans10,ppam10,
nrow = 1)
Widać na oko, że najsensowniejszy jest podział na 2 klastry, zweryfikujemy to jeszcze.
Sprawdzimy na pare sposobów jaka liczba klastrów jest najlepsza dla tego zbioru i tych algorytmów.
fviz_nbclust(data, kmeans, method = "wss") +
geom_vline(xintercept = 2, linetype = 2)+
labs(title = "Elbow method", subtitle = "for Kmeans")
fviz_nbclust(data, pam, method = "wss") +
geom_vline(xintercept = 2, linetype = 2)+
labs(title = "Elbow method", subtitle = "for Pam")
Z tych wykresów widać, że rzeczywiście liczba klastrów równa dwa jest optymalna, przyjżyjmy się jeszcze innym statystykom.
op <- par(no.readonly=TRUE)
par(mfrow=c(2,2),mar=c(4,4,3,1))
plot(wiedza, legend=FALSE)
plot(nClusters(wiedza),measures(wiedza,"Dunn")[,,1],type="n",axes=F,xlab="",ylab="")
legend("center", clusterMethods(wiedza), col=1:9, lty=1:9, pch=paste(1:9))
Po przyjrzeniu się tym wykresom już nie ma wątpliwości, że optymalna liczba to 2. Widać, również że algorytm k-means okazał się lepszy pod względem dwóch statystyk, można zatem postawić hipotezę, że jest ogólnie lepszy, a co za tym idzie będzie szybciej zbiegał.
fviz_cluster(kmeans2, geom = "point", data = data, shape = 20, show.clust.cent=TRUE,
stand=T, pointsize = 3, ellipse.type='confidence') +
ggtitle("kmeans k = 2") + theme(legend.position = "none") + xlab("")
fviz_cluster(pam2, geom = "point", data = data, shape = 20, show.clust.cent=TRUE,
stand=T, pointsize = 3, ellipse.type='confidence') +
ggtitle("kmeans k = 2") + theme(legend.position = "none") + xlab("")
Jeżeli chodzi o podział zbioru, to lepiej wypada algorytm kmeans. Podział otrzymany w ten sposób jest dużo bardziej rozłączny, co widać gołym okiem.
Centra nie znajdują się w dokładnie tych samych miejscach, ale żeby to zauważyć trzeba się mocno przyjżejć.
W celu porównania szybkości zbieżności tych algorytmów zrobimy benchmark dla 200 wywołań.
kable_styling(kable(benchmark("kmeans" = {
hc <- data %>% eclust("kmeans", k = 2, graph = FALSE)
},'pam'= {
hc <- data %>% eclust("pam", k = 2, graph = FALSE)
},
replications = 200,
columns = c("test", "replications", "elapsed",
"relative", "user.self", "sys.self"))))
| test | replications | elapsed | relative | user.self | sys.self |
|---|---|---|---|---|---|
| kmeans | 200 | 4.157 | 1.000 | 1.814 | 0.557 |
| pam | 200 | 4.731 | 1.138 | 3.169 | 0.526 |
Widać, że zdecydowanie szybszy jest algorytm kmeans, potwierdza to naszą hipoteze z wczesniej, że w tym konkretnym przypadku jest lepszy.